﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using PetSoft.GestionRecursos;
using PetSoft.GUI.Compras;
using Business_Logic;
using Business_Entity;

namespace PetSoft.GUI.GestRecursos
{
    public partial class GUIPedidoProd : Form
    {
    	private List<BEProveedor> listaProveedor;
    	private BETienda tiendaActual;
    	
        public GUIPedidoProd()
        {
            InitializeComponent();
            this.prodCodTXT.KeyPress += new KeyPressEventHandler(Utils.SoloNumerosTB);
            this.prodNomTXT.KeyPress += new KeyPressEventHandler(Utils.SoloLetrasNumerosTB);
            this.prodMarcTXT.KeyPress += new KeyPressEventHandler(Utils.SoloLetrasNumerosTB);
            this.Load += new EventHandler(cargaInicial);
            this.pedidoDGV.DoubleClick += new EventHandler(doble_click);
            this.prodDGV.DoubleClick += new EventHandler(doble_clickProd);
            try{
            	this.tiendaActual = BLInfo.TiendaActual;
            	//MessageBox.Show("" + this.tiendaActual.Id);
            	if((this.tiendaActual==null)||(this.tiendaActual.Id==0)){
            		MessageBox.Show("No se encuentra en una tienda registrada, no se puede realizar esta operación.");
            		this.Close();
            	}
            }
            catch{
            	MessageBox.Show("No se encuentra en una tienda registrada, no se puede realizar esta operación.");
            	this.Close();
            }
        }
        
        private void doble_click(object sender, EventArgs e){
			int aux = this.pedidoDGV.CurrentRow.Index;
			if(((bool)this.pedidoDGV[0, aux].Value) == true){
				this.pedidoDGV[0, aux].Value = false;
			}
			else{
				this.pedidoDGV[0, aux].Value = true;
			}
		}
        
        private void doble_clickProd(object sender, EventArgs e){
			int aux = this.prodDGV.CurrentRow.Index;
			if(((bool)this.prodDGV[0, aux].Value) == true){
				this.prodDGV[0, aux].Value = false;
			}
			else{
				this.prodDGV[0, aux].Value = true;
			}
		}
                
        private void cargaInicial(object sender, EventArgs e){
        	BLTipoProducto blTipo = new BLTipoProducto();
        	this.prodTipoCB.DataSource = blTipo.getAllTipoProd();
        	this.prodTipoCB.ValueMember = "codigo";
        	this.prodTipoCB.DisplayMember = "descripcion";
        }

        private void buscProvBTN_Click(object sender, EventArgs e)
        {
        	GUIBuscarProveedor ventBuscProv = new GUIBuscarProveedor();
            ventBuscProv.Show();
        }
		
        private void cargaTablaProductos(){
        	BLProducto prod;
        	BLProveedor prov;
			List<BEProducto> lista;   	
			int cont = 0;			
        	prod = new BLProducto();
        	prov = new BLProveedor();
        	lista = prod.getProductos();
        	this.prodDGV.Rows.Clear();
        	foreach (BEProducto p in lista) {
        		this.prodDGV.Rows.Add(false, "" + p.Codigo, "" + p.Nombre, "" + p.Descripcion, "" + p.TipoProducto.Descripcion, "" + p.Marca);
        		cont++;     		
        	}        	
        	this.cantProdValLBL.Text = "" + cont;
        }
        
        private void resBusquedaProd(List<BEProducto> lista){
        	BLProducto prod;
        	BLProductoProveedor prov; 	
			int cont = 0;			
        	prod = new BLProducto();
        	prov = new BLProductoProveedor();
        	this.prodDGV.Rows.Clear();
        	foreach (BEProducto p in lista) {
        		//MessageBox.Show("" + p.Marca);
        		this.prodDGV.Rows.Add(false, "" + p.Codigo, "" + p.Nombre, "" + p.Descripcion, "" + p.TipoProducto, "" + p.Marca);
        		cont++; 		
        	}        	
        	this.cantProdValLBL.Text = "" + cont;
        }
        
        private void prodBuscarBTN_Click(object sender, EventArgs e)
        {
            //Primero validamos cuales son los campos que serán usados para la búsqueda
        	//Todos los campos que no sean usados tendrán el valor 0 si son numero y vacio si son strings
        	int cod;
        	String nom, tipo, marca;
        	int val = (int) this.prodTipoCB.SelectedValue;
        	//Limpia la tabla de productos
        	this.prodDGV.Rows.Clear();
        	if((this.prodCodTXT.Text=="") && (this.prodNomTXT.Text=="") && (val==-1)){
        		//Se carga toda la lista de productos
        		cargaTablaProductos();
        	}
        	else{
	        	if(this.prodCodTXT.Text!=""){
	        		try{//si lo puede convertir entonces el codigo ingresado es correcto
	        			cod = Int32.Parse(this.prodCodTXT.Text);
	        			//MessageBox.Show("" + cod);
	        		}
	        		catch{//si no lo puede convertir entonces es incorrecto
	        			MessageBox.Show("Debe ingresar un código correcto.");
	        			this.prodCodTXT.Focus();
	        			return;
	        		}        		
	        	}
        		else{
        			cod=0;
	        		//MessageBox.Show("" + cod);
        		}
	        	//MessageBox.Show("" + cod);
	        	//validaSQLInjection(this.txtNomProd.Text);
	        	nom = this.prodNomTXT.Text;
	        	marca = this.prodMarcTXT.Text;
	        	if(((int)this.prodTipoCB.SelectedValue) == -1){
	        		tipo="";
	        	}
	        	else
	        		tipo = this.prodTipoCB.Text;
	        	//validaSQLInjection(this.txtProv.Text);
	        	/*if(this.txtProv.Text!="")
	        		codProv = Int32.Parse(this.txtProv.Text);
	        	else
	        		codProv = 0;*/

                BLProducto prod;
                prod = new BLProducto();
                resBusquedaProd(prod.buscarProducto(cod, nom, tipo, marca));
        	}
        }

        private void prodAgreBTN_Click(object sender, EventArgs e)
        {
        	int cont = 0, error = 0;
        	BLProducto blProd = new BLProducto();
        	String msgError = "Los siguiente productos fueron eliminados anteriormente " + Environment.NewLine +
        		"por lo que no se pudo agregar los siguientes productos:";
        	for(int i=0; i<this.prodDGV.RowCount;i++){
            	if((this.prodDGV[0,i].Value!=null) && (Convert.ToBoolean(this.prodDGV[0,i].Value) == true)){
            		//los productos seleccionados
            		if(blProd.estadoProducto(Int32.Parse(this.prodDGV[1,i].Value.ToString()))==1){            			
	            		this.pedidoDGV.Rows.Add(false, this.prodDGV[1,i].Value, this.prodDGV[2,i].Value, "", 0);
	            		cont++;
            		}
            		else{//el producto fue eliminado
            			error = 1;
            			msgError = msgError + Environment.NewLine + "   -" + this.prodDGV[2,i].Value.ToString();
            		}
        		}
            }
        	if(error == 1){
        		MessageBox.Show(msgError);
        	}
        	cargaTablaProductos();
        	this.cantPedValLBL.Text = "" + this.pedidoDGV.Rows.Count;
        }

        private void prodLimpBTN_Click(object sender, EventArgs e)
        {
            this.prodNomTXT.Clear();
            this.prodCodTXT.Clear();
            this.prodDGV.Rows.Clear();
            this.prodMarcTXT.Clear();
            this.prodTipoCB.SelectedIndex = 0;
            this.cantProdValLBL.Text = "" + 0;
        }

        private void quitarProdBTN_Click(object sender, EventArgs e)
        {
            //this.pedidoDGV.ClearSelection();
            int cont;
            cont = 0;
            for(int i=0; i<this.pedidoDGV.RowCount;i++){
            	if((this.pedidoDGV[0,i].Value!=null) && (Convert.ToBoolean(this.pedidoDGV[0,i].Value) == true)){
            		cont++;
            	}            	
            }
            if(cont==0){
            	MessageBox.Show("Debe seleccionar algún producto para eliminar.");
            }
            else{
            	for(int i=0; i<this.pedidoDGV.RowCount;i++){
            		if((this.pedidoDGV[0,i].Value!=null) && (Convert.ToBoolean(this.pedidoDGV[0,i].Value) == true)){           				
           				this.pedidoDGV.Rows.RemoveAt(i);
           				i--;
           			}            	
           		}
        	}
            this.cantPedValLBL.Text = "" + this.pedidoDGV.RowCount;
        }

        private void acepBTN_Click(object sender, EventArgs e)
        {
            /*MessageBox.Show("El pedido ha sido generado.");
            this.Close();*/
            BLPedidoAbastecimiento pPed = new BLPedidoAbastecimiento();
            for(int i=0; i<this.pedidoDGV.RowCount;i++){
            	try{
            		if(Int32.Parse(this.pedidoDGV[4,i].Value.ToString())==0){
	            		MessageBox.Show("Debes indicar la cantidad a pedir del producto.");
	            		this.pedidoDGV.ClearSelection();
	            		this.pedidoDGV[0,i].Selected = true;
	            		return;
            		}
            	}
            	catch{
            		MessageBox.Show("Debes indicar la cantidad a pedir del producto.");
            		return;
            	}
            		
            	
            }
            //Primero agregar el pedido inicial
            //POR AHORA SE MANEJA COMO ESTATICO, DEBE CAMBIAR!!!!!!!!
            //CERO ES POR EL ID DE LA TIENDA, 1 ES POR EL ID DEL PEDIDO
            //int codigoPed = 1;
            int codTienda = this.tiendaActual.Id;
            int codPed = pPed.nuevoPedido(codTienda);
            if(codPed==0){
            	MessageBox.Show("Se presento un problema con el pedido principal, no se pudo registrar el pedido.");
            }
            else{
            	//Agregar cada una de las lineas del pedido
            	BLProducto bProd = new BLProducto();
            	List<BEProducto> prod;
            	BEProducto producto;
            	BLLineaPedidoAbastecimiento linea = new BLLineaPedidoAbastecimiento();
            	int cant, codigoProv, codigoProd;
            	try{
	            	for(int i=0; i<this.pedidoDGV.RowCount;i++){
	            		prod = bProd.getProductoByCod(Int32.Parse(this.pedidoDGV[1,i].Value.ToString()));
	            		producto = prod[0];
	            		codigoProd = producto.Codigo;
	            		codigoProv = bProd.getProveedorByRSocial(this.pedidoDGV[3,i].Value.ToString()).IdProv;
		            	cant = Int32.Parse(this.pedidoDGV[4,i].Value.ToString());
		            	int res = linea.nuevaLineaPedido(codPed, codigoProd, codigoProv, cant);
		            	
		            }
            		MessageBox.Show("El pedido fue solicitado correctamente.");
            		this.Close();
            	}
            	catch{
            		MessageBox.Show("Se presento un problema dentro del for, no se pudo registrar el pedido.");
            	}
            }
        }

        private void cancelBTN_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        
        void GUIPedidoProdLoad(object sender, EventArgs e)
        {
        	
        }
        
        void EliCBCOLCheckedChanged(object sender, EventArgs e)
        {
        	for(int i=0; i<this.prodDGV.RowCount; i++){
        		this.prodDGV[0, i].Value = this.eliCBCOL.Checked;
				//list[0, i].Value = ((CheckBox) list.Controls.Find("checkboxHeader", true)[0]).Checked;    		
        	}
        }
        
        void EliPordCBCOLCheckedChanged(object sender, EventArgs e)
        {
        	for(int i=0; i<this.pedidoDGV.RowCount; i++){
        		this.pedidoDGV[0, i].Value = this.eliPordCBCOL.Checked;
				//list[0, i].Value = ((CheckBox) list.Controls.Find("checkboxHeader", true)[0]).Checked;    		
        	}
        }
                
        void PedDetBTNClick(object sender, EventArgs e)
        {
        	int cont=0, index=0;
        	for(int i=0; i<this.pedidoDGV.RowCount;i++){
            	if((this.pedidoDGV[0,i].Value!=null) && (Convert.ToBoolean(this.pedidoDGV[0,i].Value) == true)){
            		//los productos seleccionados
            		cont++;
            		index = i;
        		}
            }
        	if(cont==0){
        		MessageBox.Show("Debe seleccionar algún producto de la lista de pedidos.");
        	}
        	if(cont>1){
        		MessageBox.Show("Debe seleccionar solo 1 producto para poder configurar sus detalles.");
        	}
        	if(cont==1){
	        	DataGridViewRow fila = this.pedidoDGV.Rows[index];
	        	int codigo = Int32.Parse(fila.Cells[1].Value.ToString());
	        	String proveedor = fila.Cells[3].Value.ToString();
	        	int cantidad = Int32.Parse(fila.Cells[4].Value.ToString());
	        	BLProducto blProd = new BLProducto();
	        	List<BEProducto> prod = blProd.getProductoByCod(codigo);
	        	GUIDatosProductoPedido vent = new GUIDatosProductoPedido(1, prod[0], proveedor, cantidad, listaProveedor);
	        	vent.ShowDialog();
	        	BEProveedor prov = vent.getProveedor();
	        	int cant = vent.getCantidad();
	        	fila.Cells[4].Value = cant;
	        	if(prov != null){
	        		fila.Cells[3].Value = prov.RazonSocial;
	        	} 
        	}
        }
    }
}
